

https://leetcode.cn/problems/Jf1JuT/description/
//class Solution {
//public:
//
//    unordered_map<char, unordered_set<char>> hash;
//    unordered_map<char, int> in;
//    bool check;
//
//    void addword(string& s1, string& s2) {
//
//        int n = min(s1.size(), s2.size());
//        int i = 0;
//        for (; i < n; i++) {
//            if (s1[i] != s2[i]) {
//                char a = s1[i], b = s2[i];
//                if (!hash.count(a) || !hash[a].count(b)) {
//                    hash[a].insert(b);
//                    in[b]++;
//                }
//                break;
//            }
//        }
//
//        if (i == s2.size() && i < s1.size()) {
//            check = true;
//        }
//    }
//    string alienOrder(vector<string>& words) {
//
//
//        for (auto& e : words) {
//            for (auto& x : e) {
//                in[x] = 0;
//            }
//        }
//
//        int n = words.size();
//        for (int i = 0; i < n; i++) {
//            for (int j = i + 1; j < n; j++) {
//                addword(words[i], words[j]);
//                if (check) return "";
//            }
//        }
//
//        string s;
//        queue<char> q;
//        for (auto& [a, b] : in) {
//            if (b == 0) {
//                q.push(a);
//            }
//        }
//
//        while (q.size()) {
//            char t = q.front();
//            q.pop();
//            s += t;
//            for (char ch : hash[t]) {
//                if (--in[ch] == 0) {
//                    q.push(ch);
//                }
//            }
//        }
//
//        for (auto& [a, b] : in) {
//            if (b != 0) {
//                return "";
//            }
//        }
//
//        return s;
//    }
//};